libraries

library(dplyr)
library(ggplot2)
library(nnet)
library(psych)
library(corrplot)
library(tidyverse)
package 㤼㸱tidyverse㤼㸲 was built under R version 3.5.3-- Attaching packages --------------------------------------- tidyverse 1.2.1 --
v tibble  2.1.3     v purrr   0.3.2
v tidyr   0.8.3     v stringr 1.4.0
v readr   1.3.1     v forcats 0.4.0
package 㤼㸱tibble㤼㸲 was built under R version 3.5.3package 㤼㸱tidyr㤼㸲 was built under R version 3.5.3package 㤼㸱readr㤼㸲 was built under R version 3.5.3package 㤼㸱purrr㤼㸲 was built under R version 3.5.3package 㤼㸱stringr㤼㸲 was built under R version 3.5.3package 㤼㸱forcats㤼㸲 was built under R version 3.5.3-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x psych::%+%()        masks ggplot2::%+%()
x purrr::accumulate() masks foreach::accumulate()
x psych::alpha()      masks ggplot2::alpha()
x dplyr::between()    masks data.table::between()
x dplyr::combine()    masks randomForest::combine()
x tidyr::expand()     masks Matrix::expand()
x dplyr::filter()     masks stats::filter()
x dplyr::first()      masks data.table::first()
x dplyr::lag()        masks stats::lag()
x dplyr::last()       masks data.table::last()
x purrr::lift()       masks caret::lift()
x ggplot2::margin()   masks randomForest::margin()
x dplyr::slice()      masks xgboost::slice()
x purrr::transpose()  masks data.table::transpose()
x purrr::when()       masks foreach::when()

Load data

data<- read.csv("C://Users/s137r4//Desktop//Analysisfile//Accident14_17.csv")
Warning: closing unused connection 16 (<-CHR5C99E.corp.gwpnet.com:11346)
Warning: closing unused connection 15 (<-CHR5C99E.corp.gwpnet.com:11346)
Warning: closing unused connection 14 (<-CHR5C99E.corp.gwpnet.com:11346)
Warning: closing unused connection 9 (<-CHR5C99E.corp.gwpnet.com:11346)
Warning: closing unused connection 8 (<-CHR5C99E.corp.gwpnet.com:11346)
Warning: closing unused connection 7 (<-CHR5C99E.corp.gwpnet.com:11346)
Warning: closing unused connection 6 (<-CHR5C99E.corp.gwpnet.com:11346)
data <- data[, -c(1)]

missing values

p<- function(x){sum(is.na(x))/length(x)*100}
apply(data, 2, p)
                                          X                              Accident_Index                       Location_Easting_OSGR 
                                0.000000000                                 0.000000000                                 0.010534305 
                     Location_Northing_OSGR                                   Longitude                                    Latitude 
                                0.010534305                                 0.006224816                                 0.006224816 
                               Police_Force                           Accident_Severity                          Number_of_Vehicles 
                                0.000000000                                 0.000000000                                 0.000000000 
                       Number_of_Casualties                                        Date                                 Day_of_Week 
                                0.000000000                                 0.000000000                                 0.000000000 
                                       Time                  Local_Authority_.District.                   Local_Authority_.Highway. 
                                0.000000000                                 0.000000000                                 0.000000000 
                            X1st_Road_Class                            X1st_Road_Number                                   Road_Type 
                                0.000000000                                 0.000000000                                 0.000000000 
                                Speed_limit                             Junction_Detail                            Junction_Control 
                                0.000000000                                 0.000000000                                 0.000000000 
                            X2nd_Road_Class                            X2nd_Road_Number           Pedestrian_Crossing.Human_Control 
                                0.000000000                                 0.000000000                                 0.000000000 
    Pedestrian_Crossing.Physical_Facilities                            Light_Conditions                          Weather_Conditions 
                                0.000000000                                 0.000000000                                 0.000000000 
                    Road_Surface_Conditions                  Special_Conditions_at_Site                         Carriageway_Hazards 
                                0.000000000                                 0.000000000                                 0.000000000 
                        Urban_or_Rural_Area Did_Police_Officer_Attend_Scene_of_Accident                   LSOA_of_Accident_Location 
                                0.000000000                                 0.000000000                                 0.000000000 
                          Vehicle_Reference                                Vehicle_Type                     Towing_and_Articulation 
                                0.000000000                                 0.000000000                                 0.000000000 
                          Vehicle_Manoeuvre            Vehicle_Location.Restricted_Lane                           Junction_Location 
                                0.000000000                                 0.000000000                                 0.000000000 
                   Skidding_and_Overturning                   Hit_Object_in_Carriageway                 Vehicle_Leaving_Carriageway 
                                0.000000000                                 0.000000000                                 0.000000000 
                 Hit_Object_off_Carriageway                        X1st_Point_of_Impact                Was_Vehicle_Left_Hand_Drive. 
                                0.000000000                                 0.000000000                                 0.000000000 
                  Journey_Purpose_of_Driver                               Sex_of_Driver                               Age_of_Driver 
                                0.000000000                                 0.000000000                                 0.000000000 
                         Age_Band_of_Driver                        Engine_Capacity_.CC.                             Propulsion_Code 
                                0.000000000                                 0.000000000                                 0.000000000 
                             Age_of_Vehicle                           Driver_IMD_Decile                       Driver_Home_Area_Type 
                                0.000000000                                 0.000000000                                 0.000000000 
                         Casualty_Reference                              Casualty_Class                             Sex_of_Casualty 
                                0.000000000                                 0.000000000                                 0.000000000 
                            Age_of_Casualty                        Age_Band_of_Casualty                           Casualty_Severity 
                                0.000000000                                 0.000000000                                 0.000000000 
                        Pedestrian_Location                         Pedestrian_Movement                               Car_Passenger 
                                0.000000000                                 0.000000000                                 0.000000000 
                     Bus_or_Coach_Passenger          Pedestrian_Road_Maintenance_Worker                               Casualty_Type 
                                0.000000000                                 0.000000000                                 0.000000000 
                    Casualty_Home_Area_Type                                        Year 
                                0.000000000                                 0.000000000 
colz <- c(7,11,15:31,34:48, 50:67)
data[, colz]<-lapply(data[, colz], factor)
by_year_count <- data %>% select(Accident_Index, Year) %>% group_by(Year) %>% summarise(total.count=n())%>% mutate(total.count = total.count/sum(total.count)*100)
by_year_count
chart_year <- ggplot(data=by_year_count, aes(x=Year, y=total.count, fill=Year)) + geom_bar(stat="identity")+geom_text(aes(label=paste0(round(total.count, 2),"%")),position=position_dodge(width=0.9), vjust=-0.25)
chart_year

by_yearsev <- data %>% select(Accident_Index, Year, Accident_Severity) %>% group_by(Year, Accident_Severity) %>% summarise(total.count=n())%>% mutate(total.count = total.count/sum(total.count)*100)
by_yearsev
chart_yearsev <- ggplot(data=by_yearsev, aes(x=Year, y=total.count, fill=Accident_Severity)) + geom_bar(stat="identity")+geom_text(aes(label=paste0(round(total.count, 2),"%")),position=position_stack(vjust=0.25))
chart_yearsev

recoding

data <- data %>%
  mutate(Vehicle_Manoeuvre_category=case_when(Vehicle_Manoeuvre %in% 1:5~"Low_speed_manoeuvre",
                          Vehicle_Manoeuvre %in% 6:10 ~ "Turning_Manoeuvre",
                          Vehicle_Manoeuvre %in% 11:15 ~ "Lane_change_Manoeuvre",
                          Vehicle_Manoeuvre %in% 16:18 ~ "Going_ahead_Manoeuvre"
                        ))
manaouvre<- data %>% select(Accident_Index, Vehicle_Manoeuvre_category)%>% group_by(Vehicle_Manoeuvre_category) %>% summarise(t_count = n())%>% drop_na(Vehicle_Manoeuvre_category)%>% mutate(t_count = t_count/sum(t_count)*100)
manaouvre
manuevsev<- data %>% select(Accident_Index,Accident_Severity, Vehicle_Manoeuvre_category)%>% group_by(Vehicle_Manoeuvre_category, Accident_Severity) %>% summarise(t_count = n())%>% drop_na(Vehicle_Manoeuvre_category)%>% mutate(t_count = t_count/sum(t_count)*100)
manuevsev
data<-data%>%
  filter(Urban_or_Rural_Area %in% 1:2)
data<-data%>%
  filter(Light_Conditions %in% 1:7)
#1-highway 2- other roads 
data <- data %>%
  mutate(Highway=case_when( X1st_Road_Class %in% 1:2~ 1,
                            X1st_Road_Class %in% 3:6 ~ 0))
# 1 - daylight and 2- darkness 
data <- data %>%
  mutate(Light_Cond=case_when(Light_Conditions ==1 ~ 1,
                              Light_Conditions %in% 2:7 ~ 0))
light<- data %>% select(Accident_Index, Light_Cond)%>% group_by(Light_Cond) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
light
light1<- data %>% select(Accident_Index, Light_Cond,Accident_Severity)%>% group_by(Light_Cond,Accident_Severity) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
light1
table(data$Light_Cond)

     0      1 
121617 296039 
table(data$Highway)

     0      1 
394659  22997 
data <- data %>%
  mutate(Weather_Cond=case_when(Weather_Conditions==1 ~1,
                                Weather_Conditions %in% 2:8 ~0
                                      ))
weather<- data %>% select(Accident_Index, Weather_Cond)%>% group_by(Weather_Cond) %>% summarise(t_count = n())%>% drop_na(Weather_Cond)%>%  mutate(t_count = t_count/sum(t_count)*100)
weather
weather2<- data %>% select(Accident_Index, Weather_Cond,Accident_Severity)%>% group_by(Weather_Cond,Accident_Severity) %>% summarise(t_count = n())%>% drop_na(Weather_Cond) %>% mutate(t_count = t_count/sum(t_count)*100)
weather2
table(data$Highway)

     0      1 
394659  22997 
data <- data %>%
  mutate(Road_Surface_Cond=case_when(Road_Surface_Conditions==1 ~1,
                                      Road_Surface_Conditions %in% 2:7 ~0
                                     ))
#1- dry and 2- wet
table(data$Road_Surface_Cond)

     0      1 
129537 286113 
Road_Sc<- data %>% select(Accident_Index,Road_Surface_Cond)%>% group_by(Road_Surface_Cond)%>% drop_na(Road_Surface_Cond) %>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
Road_Sc
Road_Sc1<- data %>% select(Accident_Index,Road_Surface_Cond,Accident_Severity)%>% group_by(Road_Surface_Cond,Accident_Severity)%>% drop_na(Road_Surface_Cond) %>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
Road_Sc1
data <- data %>%
  mutate(Area=case_when(Urban_or_Rural_Area==1& Highway==1 ~ "Highway",
                        Urban_or_Rural_Area==2& Highway==1 ~"Highway",
                        Urban_or_Rural_Area==1& Highway==0 ~ "Urban",
                        Urban_or_Rural_Area==2& Highway==0 ~ "Rural"))
table(data$Area)

Highway   Rural   Urban 
  22997  149779  244880 
areads<- data %>% select(Accident_Index,Area)%>% group_by(Area) %>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
areads
areads1<- data %>% select(Accident_Index,Area,Accident_Severity)%>% group_by(Area,Accident_Severity) %>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
areads1
data <- data %>%
  mutate(spd_lt=case_when(Speed_limit %in% 1:20 ~"0-30",
                          Speed_limit %in% 20:30 ~ "30-60",
                          Speed_limit %in% 40:60 ~"60-100",
                          Speed_limit == 70 ~"100-130"))
table(data$spd_lt)

   0-30 100-130   30-60  60-100 
 113875   28838  178895   96048 
spdlt<- data %>% select(Accident_Index,spd_lt)%>% group_by(spd_lt) %>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
spdlt
spdlt1<- data %>% select(Accident_Index,spd_lt,Accident_Severity)%>% group_by(spd_lt,Accident_Severity) %>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
spdlt1
data <- data %>%
  mutate(Hit_object_on_carraige_way =case_when(Hit_Object_in_Carriageway == 1 ~ 1,
                          Hit_Object_in_Carriageway == 2 ~ 0,
                          Hit_Object_in_Carriageway == 4 ~ 1,
                          Hit_Object_in_Carriageway == 5:7 ~ 0,
                          Hit_Object_in_Carriageway == 9:12 ~ 0,
                          Hit_Object_in_Carriageway == 8 ~ 1,
                          Hit_Object_in_Carriageway == 0 ~ 0,
                          Hit_Object_in_Carriageway == 2 ~ 0,))

table(data$Hit_object_on_carraige_way)
obstacle<- data %>% select(Accident_Index,Hit_object_on_carraige_way)%>% group_by(Hit_object_on_carraige_way) %>% drop_na(Hit_object_on_carraige_way)%>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
obstacle
obstacle1<- data %>% select(Accident_Index,Hit_object_on_carraige_way,Accident_Severity,)%>% group_by(Hit_object_on_carraige_way,Accident_Severity) %>% drop_na(Hit_object_on_carraige_way)%>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
obstacle1
data<-data%>%
  filter(X1st_Point_of_Impact %in% 0:4)
table(data$X1st_Point_of_Impact)
impact<- data %>% select(Accident_Index,X1st_Point_of_Impact)%>% group_by(X1st_Point_of_Impact) %>% drop_na(X1st_Point_of_Impact)%>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
impact
impact1<- data %>% select(Accident_Index,X1st_Point_of_Impact,Accident_Severity)%>% group_by(X1st_Point_of_Impact,Accident_Severity) %>% drop_na(X1st_Point_of_Impact)%>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
impact1

pedestrian movement

data <- data %>%
  mutate(Pedestrian_Mvt=case_when(Pedestrian_Movement %in%  1:4 ~1,
                                  Pedestrian_Movement %in%  5:9 ~0,
                                  Pedestrian_Movement ==  0 ~0
                                      ))
table(data$Pedestrian_Mvt)
pedmove<- data %>% select(Accident_Index,Pedestrian_Mvt)%>% group_by(Pedestrian_Mvt)%>%  drop_na(Pedestrian_Mvt)%>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
pedmove
pedmove1<- data %>% select(Accident_Index,Pedestrian_Mvt,Accident_Severity)%>% group_by(Pedestrian_Mvt,Accident_Severity)%>%  drop_na(Pedestrian_Mvt)%>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
pedmove1

Casualty type


table(data$Casualty_Type)

casualty class this tow are interchangable and casaulty type

castyp<- data %>% select(Accident_Index,Casualty_Class)%>% group_by(Casualty_Class)%>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
castyp
castyp1<- data %>% select(Accident_Index,Casualty_Class,Accident_Severity)%>% group_by(Casualty_Class,Accident_Severity)%>% summarise(t_count = n())%>%  mutate(t_count = t_count/sum(t_count)*100)
castyp1

by variate analysis

highway_urban <- data %>% select(Accident_Index, Urban_or_Rural_Area, Highway )%>% group_by(Urban_or_Rural_Area, Highway ) %>% summarise(t_count = n())
highway_urban
chart_highway_urban<- ggplot(data=highway_urban, aes(x=Highway, y=t_count, fill=Urban_or_Rural_Area))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2))), position = position_stack(vjust=0.9))+labs(y="Number of accidents", x= "Road type")+ scale_fill_discrete(name= "Area", labels=c("Urban", "Rural"))+
  theme(legend.position="bottom", legend.direction="horizontal",
        legend.title = element_blank())+ scale_fill_manual(values =c("#00BFFF", "#1E90FF"))
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale.
chart_highway_urban

area

areasev<- data %>% select(Accident_Index,Accident_Severity, Area)%>% group_by(Accident_Severity,Area) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
areasev
chart_areasev<- ggplot(data=areasev, aes(x=Accident_Severity, y=t_count, fill= Area))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2), "%")), position = position_stack(vjust=0.9))+labs(y="Percentage", x= "Accident severity")+ scale_fill_discrete(name= "Area", labels=c("Higheway", "Urban", "Rural"))+
  theme(legend.position="bottom", legend.direction="horizontal",
        legend.title = element_blank())#+scale_fill_brewer(palette = "Set2") #scale_fill_manual(values =c("#00BFFF", "#1E90FF", "#4169E1"))
chart_areasev

manuevsev<- data %>% select(Accident_Index,Accident_Severity, Vehicle_Manoeuvre_category)%>% group_by(Vehicle_Manoeuvre_category, Accident_Severity) %>% summarise(t_count = n())%>% drop_na(Vehicle_Manoeuvre_category)%>% mutate(t_count = t_count/sum(t_count)*100)
manuevsev

ADAS classification

data <- data %>%
  mutate(accident_type=case_when(Vehicle_Manoeuvre_category=="Going_ahead_Manoeuvre"& X1st_Point_of_Impact==1 & Number_of_Vehicles==2 & Junction_Detail==0 ~ "Rear-end collision",
                        Vehicle_Manoeuvre_category=="Turning_Manoeuvre" & X1st_Point_of_Impact %in% 3:4 & Number_of_Vehicles==2 &Junction_Detail %in% 1:9 ~ "Turning collision",
                        Vehicle_Manoeuvre_category=="Going_ahead_Manoeuvre" & Number_of_Vehicles==2 & X1st_Point_of_Impact %in% 2:3 &Junction_Detail %in% 1:9 ~ "Entering/crossing collision",
                        Vehicle_Manoeuvre_category=="Lane_change_Manoeuvre" & Hit_object_on_carraige_way==1 ~ "Collision with stationary traffic",
                        Vehicle_Manoeuvre_category=="Lane_change_Manoeuvre"& X1st_Point_of_Impact %in% 3:4 ~"collision with longitunal traffic",
                        Pedestrian_Mvt ==1 & Casualty_Class==3 ~ "Accident with pedestrian crossing the road",
                        Hit_object_on_carraige_way==1 & X1st_Point_of_Impact ==1 ~"Accident with other obsctacles on the carriageway"
                        ))
table(data$accident_type)

Accident with other obsctacles on the carriageway        Accident with pedestrian crossing the road                 collision with longitunal traffic 
                                             3547                                             50843                                              5272 
                Collision with stationary traffic                       Entering/crossing collision                                Rear-end collision 
                                              596                                             17666                                             31601 
                                Turning collision 
                                            15309 
acctype<- data %>% select(Accident_Index,accident_type  )%>% group_by(accident_type) %>% summarise(t_count = n())%>%drop_na(accident_type)%>% mutate(t_count = t_count/sum(t_count)*100)
acctype
chart_acctype<- ggplot(data=acctype, aes(x=accident_type , y=t_count, fill= accident_type ))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2), "%")),position=position_dodge(width=0.9), vjust=-0.25)
chart_acctype

acctypearea<- data %>% select(Accident_Index,Area,accident_type)%>% group_by(accident_type,Area) %>% drop_na(accident_type) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
acctypearea
chart_acctypearea<- ggplot(data=acctypearea, aes(x=accident_type, y=t_count, fill= Area ))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2), "%")),position=position_stack(vjust=0.9))+labs(y="Percent %", x= "Accident Type")+ scale_fill_discrete(name= "Area", labels=c("Highway", "Urban", "Rural"))
chart_acctypearea

acctypspeed<- data %>% select(Accident_Index,spd_lt,accident_type)%>% group_by(accident_type,spd_lt) %>% drop_na(accident_type) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
acctypspeed
chart_acctypspeed<- ggplot(data=acctypspeed, aes(x=accident_type, y=t_count, fill= spd_lt ))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2), "%")),position=position_stack(vjust=0.9))+labs(y="Percent %", x= "Accident Type") #scale_fill_discrete(name= "Area", labels=c("Highway", "Urban", "Rural"))
chart_acctypspeed

severity, just slight and fatal as ADAS can not do much about slight

acctypsev<- data %>% select(Accident_Index,Accident_Severity,accident_type)%>% group_by(accident_type,Accident_Severity) %>% drop_na(accident_type) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
acctypsev
chart_acctypsev<- ggplot(data=acctypsev, aes(x=accident_type, y=t_count, fill=Accident_Severity ))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2), "%")),position=position_stack(vjust=0.9))+labs(y="Percent %", x= "Accident Type") #scale_fill_discrete(name= "Area", labels=c("Highway", "Urban", "Rural"))
chart_acctypsev

acctypall<- data %>% select(Accident_Index,Accident_Severity,accident_type, Area, spd_lt)%>% group_by(accident_type,Area, spd_lt,Accident_Severity) %>% drop_na(accident_type) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
acctypall
dataa1 <- data
filter(dataa1, Age_of_Vehicle < 5 & Accident_Severity !=3) 
㤼㸱<㤼㸲 not meaningful for factors
NA
dataa1<-dataa1 %>%
  filter(Age_of_Vehicle %in% 1:6 & Accident_Severity %in% 1:2)
acctypall2<- dataa1 %>% select(Accident_Index,Accident_Severity,accident_type, Area, spd_lt)%>% group_by(accident_type,Area, spd_lt,Accident_Severity) %>% drop_na(accident_type) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
acctypall2
acctype1<- dataa1 %>% select(Accident_Index,accident_type  )%>% group_by(accident_type) %>% summarise(t_count = n())%>%drop_na(accident_type)%>% mutate(t_count = t_count/sum(t_count)*100)
acctype
chart_acctype1<- ggplot(data=acctype1, aes(x=accident_type , y=t_count, fill= accident_type ))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2), "%")),position=position_dodge(width=0.9), vjust=-0.25)
chart_acctype1

acctypspeed1<- dataa1 %>% select(Accident_Index,spd_lt,accident_type)%>% group_by(accident_type,spd_lt) %>% drop_na(accident_type) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
acctypspeed1
chart_acctypspeed1<- ggplot(data=acctypspeed1, aes(x=accident_type, y=t_count, fill= spd_lt ))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2), "%")),position=position_stack(vjust=0.9))+labs(y="Percent %", x= "Accident Type") #scale_fill_discrete(name= "Area", labels=c("Highway", "Urban", "Rural"))
chart_acctypspeed1

acctypsev1<- dataa1 %>% select(Accident_Index,Accident_Severity,accident_type)%>% group_by(accident_type,Accident_Severity) %>% drop_na(accident_type) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
acctypsev
chart_acctypsev1<- ggplot(data=acctypsev1, aes(x=accident_type, y=t_count, fill=Accident_Severity ))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2), "%")),position=position_stack(vjust=0.9))+labs(y="Percent %", x= "Accident Type") #scale_fill_discrete(name= "Area", labels=c("Highway", "Urban", "Rural"))
chart_acctypsev1

acctypearea1<- dataa1 %>% select(Accident_Index,Area,accident_type)%>% group_by(accident_type,Area) %>% drop_na(accident_type) %>% summarise(t_count = n())%>% mutate(t_count = t_count/sum(t_count)*100)
acctypearea1
chart_acctypearea1<- ggplot(data=acctypearea1, aes(x=accident_type, y=t_count, fill= Area ))+geom_bar(stat = "identity")+geom_text(aes(label=paste0(round(t_count, 2), "%")),position=position_stack(vjust=0.9))+labs(y="Percent %", x= "Accident Type")+ scale_fill_discrete(name= "Area", labels=c("Highway", "Urban", "Rural"))
chart_acctypearea1

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpsaWJyYXJpZXMgDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KG5uZXQpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQoNCmBgYA0KDQpMb2FkIGRhdGENCmBgYHtyfQ0KZGF0YTwtIHJlYWQuY3N2KCJDOi8vVXNlcnMvczEzN3I0Ly9EZXNrdG9wLy9BbmFseXNpc2ZpbGUvL0FjY2lkZW50MTRfMTcuY3N2IikNCmRhdGEgPC0gZGF0YVssIC1jKDEpXQ0KDQpgYGANCg0KbWlzc2luZyB2YWx1ZXMgDQpgYGB7cn0NCnA8LSBmdW5jdGlvbih4KXtzdW0oaXMubmEoeCkpL2xlbmd0aCh4KSoxMDB9DQphcHBseShkYXRhLCAyLCBwKQ0KYGBgDQoNCmBgYHtyfQ0KY29seiA8LSBjKDcsMTEsMTU6MzEsMzQ6NDgsIDUwOjY3KQ0KZGF0YVssIGNvbHpdPC1sYXBwbHkoZGF0YVssIGNvbHpdLCBmYWN0b3IpDQpgYGANCg0KDQoNCg0KYGBge3J9DQpieV95ZWFyX2NvdW50IDwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCwgWWVhcikgJT4lIGdyb3VwX2J5KFllYXIpICU+JSBzdW1tYXJpc2UodG90YWwuY291bnQ9bigpKSU+JSBtdXRhdGUodG90YWwuY291bnQgPSB0b3RhbC5jb3VudC9zdW0odG90YWwuY291bnQpKjEwMCkNCmJ5X3llYXJfY291bnQNCg0KY2hhcnRfeWVhciA8LSBnZ3Bsb3QoZGF0YT1ieV95ZWFyX2NvdW50LCBhZXMoeD1ZZWFyLCB5PXRvdGFsLmNvdW50LCBmaWxsPVllYXIpKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZTAocm91bmQodG90YWwuY291bnQsIDIpLCIlIikpLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIHZqdXN0PS0wLjI1KQ0KY2hhcnRfeWVhcg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KDQpieV95ZWFyc2V2IDwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCwgWWVhciwgQWNjaWRlbnRfU2V2ZXJpdHkpICU+JSBncm91cF9ieShZZWFyLCBBY2NpZGVudF9TZXZlcml0eSkgJT4lIHN1bW1hcmlzZSh0b3RhbC5jb3VudD1uKCkpJT4lIG11dGF0ZSh0b3RhbC5jb3VudCA9IHRvdGFsLmNvdW50L3N1bSh0b3RhbC5jb3VudCkqMTAwKQ0KYnlfeWVhcnNldg0KDQpjaGFydF95ZWFyc2V2IDwtIGdncGxvdChkYXRhPWJ5X3llYXJzZXYsIGFlcyh4PVllYXIsIHk9dG90YWwuY291bnQsIGZpbGw9QWNjaWRlbnRfU2V2ZXJpdHkpKSArIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZTAocm91bmQodG90YWwuY291bnQsIDIpLCIlIikpLHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuMjUpKQ0KY2hhcnRfeWVhcnNldg0KYGBgDQoNCg0KDQpyZWNvZGluZyANCmBgYHtyfQ0KZGF0YSA8LSBkYXRhICU+JQ0KICBtdXRhdGUoVmVoaWNsZV9NYW5vZXV2cmVfY2F0ZWdvcnk9Y2FzZV93aGVuKFZlaGljbGVfTWFub2V1dnJlICVpbiUgMTo1fiJMb3dfc3BlZWRfbWFub2V1dnJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgVmVoaWNsZV9NYW5vZXV2cmUgJWluJSA2OjEwIH4gIlR1cm5pbmdfTWFub2V1dnJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgVmVoaWNsZV9NYW5vZXV2cmUgJWluJSAxMToxNSB+ICJMYW5lX2NoYW5nZV9NYW5vZXV2cmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBWZWhpY2xlX01hbm9ldXZyZSAlaW4lIDE2OjE4IH4gIkdvaW5nX2FoZWFkX01hbm9ldXZyZSINCiAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCmBgYA0KDQpgYGB7cn0NCm1hbmFvdXZyZTwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCwgVmVoaWNsZV9NYW5vZXV2cmVfY2F0ZWdvcnkpJT4lIGdyb3VwX2J5KFZlaGljbGVfTWFub2V1dnJlX2NhdGVnb3J5KSAlPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lIGRyb3BfbmEoVmVoaWNsZV9NYW5vZXV2cmVfY2F0ZWdvcnkpJT4lIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0KbWFuYW91dnJlDQpgYGANCmBgYHtyfQ0KbWFudWV2c2V2PC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LEFjY2lkZW50X1NldmVyaXR5LCBWZWhpY2xlX01hbm9ldXZyZV9jYXRlZ29yeSklPiUgZ3JvdXBfYnkoVmVoaWNsZV9NYW5vZXV2cmVfY2F0ZWdvcnksIEFjY2lkZW50X1NldmVyaXR5KSAlPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lIGRyb3BfbmEoVmVoaWNsZV9NYW5vZXV2cmVfY2F0ZWdvcnkpJT4lIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0KbWFudWV2c2V2DQoNCmBgYA0KDQoNCg0KYGBge3J9DQpkYXRhPC1kYXRhJT4lDQogIGZpbHRlcihVcmJhbl9vcl9SdXJhbF9BcmVhICVpbiUgMToyKQ0KZGF0YTwtZGF0YSU+JQ0KICBmaWx0ZXIoTGlnaHRfQ29uZGl0aW9ucyAlaW4lIDE6NykNCg0KIzEtaGlnaHdheSAyLSBvdGhlciByb2FkcyANCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKEhpZ2h3YXk9Y2FzZV93aGVuKCBYMXN0X1JvYWRfQ2xhc3MgJWluJSAxOjJ+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWDFzdF9Sb2FkX0NsYXNzICVpbiUgMzo2IH4gMCkpDQoNCiMgMSAtIGRheWxpZ2h0IGFuZCAyLSBkYXJrbmVzcyANCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKExpZ2h0X0NvbmQ9Y2FzZV93aGVuKExpZ2h0X0NvbmRpdGlvbnMgPT0xIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZ2h0X0NvbmRpdGlvbnMgJWluJSAyOjcgfiAwKSkNCg0KYGBgDQoNCmBgYHtyfQ0KbGlnaHQ8LSBkYXRhICU+JSBzZWxlY3QoQWNjaWRlbnRfSW5kZXgsIExpZ2h0X0NvbmQsKSU+JSBncm91cF9ieShMaWdodF9Db25kKSAlPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0KbGlnaHQNCmBgYA0KDQpgYGB7cn0NCmxpZ2h0MTwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCwgTGlnaHRfQ29uZCxBY2NpZGVudF9TZXZlcml0eSklPiUgZ3JvdXBfYnkoTGlnaHRfQ29uZCxBY2NpZGVudF9TZXZlcml0eSkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCmxpZ2h0MQ0KDQpgYGANCg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkTGlnaHRfQ29uZCkNCmBgYA0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkSGlnaHdheSkNCmBgYA0KDQpgYGB7cn0NCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKFdlYXRoZXJfQ29uZD1jYXNlX3doZW4oV2VhdGhlcl9Db25kaXRpb25zPT0xIH4xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWF0aGVyX0NvbmRpdGlvbnMgJWluJSAyOjggfjANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KDQoNCmBgYA0KDQpgYGB7cn0NCndlYXRoZXI8LSBkYXRhICU+JSBzZWxlY3QoQWNjaWRlbnRfSW5kZXgsIFdlYXRoZXJfQ29uZCklPiUgZ3JvdXBfYnkoV2VhdGhlcl9Db25kKSAlPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lICBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCndlYXRoZXINCmBgYA0KYGBge3J9DQp3ZWF0aGVyMjwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCwgV2VhdGhlcl9Db25kLEFjY2lkZW50X1NldmVyaXR5KSU+JSBncm91cF9ieShXZWF0aGVyX0NvbmQsQWNjaWRlbnRfU2V2ZXJpdHkpICU+JSBzdW1tYXJpc2UodF9jb3VudCA9IG4oKSklPiUgZHJvcF9uYShXZWF0aGVyX0NvbmQpICU+JSBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCndlYXRoZXIyDQpgYGANCg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkSGlnaHdheSkNCmBgYA0KDQoNCmBgYHtyfQ0KDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSb2FkX1N1cmZhY2VfQ29uZD1jYXNlX3doZW4oUm9hZF9TdXJmYWNlX0NvbmRpdGlvbnM9PTEgfjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvYWRfU3VyZmFjZV9Db25kaXRpb25zICVpbiUgMjo3IH4wDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCiMxLSBkcnkgYW5kIDItIHdldA0KdGFibGUoZGF0YSRSb2FkX1N1cmZhY2VfQ29uZCkNCmBgYA0KYGBge3J9DQpSb2FkX1NjPC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LFJvYWRfU3VyZmFjZV9Db25kKSU+JSBncm91cF9ieShSb2FkX1N1cmZhY2VfQ29uZCklPiUgZHJvcF9uYShSb2FkX1N1cmZhY2VfQ29uZCkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSAgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQpSb2FkX1NjDQoNCmBgYA0KYGBge3J9DQpSb2FkX1NjMTwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCxSb2FkX1N1cmZhY2VfQ29uZCxBY2NpZGVudF9TZXZlcml0eSklPiUgZ3JvdXBfYnkoUm9hZF9TdXJmYWNlX0NvbmQsQWNjaWRlbnRfU2V2ZXJpdHkpJT4lIGRyb3BfbmEoUm9hZF9TdXJmYWNlX0NvbmQpICU+JSBzdW1tYXJpc2UodF9jb3VudCA9IG4oKSklPiUgIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0KUm9hZF9TYzENCmBgYA0KDQoNCg0KDQpgYGB7cn0NCg0KDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShBcmVhPWNhc2Vfd2hlbihVcmJhbl9vcl9SdXJhbF9BcmVhPT0xJiBIaWdod2F5PT0xIH4gIkhpZ2h3YXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgVXJiYW5fb3JfUnVyYWxfQXJlYT09MiYgSGlnaHdheT09MSB+IkhpZ2h3YXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgVXJiYW5fb3JfUnVyYWxfQXJlYT09MSYgSGlnaHdheT09MCB+ICJVcmJhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICBVcmJhbl9vcl9SdXJhbF9BcmVhPT0yJiBIaWdod2F5PT0wIH4gIlJ1cmFsIikpDQoNCnRhYmxlKGRhdGEkQXJlYSkNCmBgYA0KDQoNCg0KYGBge3J9DQphcmVhZHM8LSBkYXRhICU+JSBzZWxlY3QoQWNjaWRlbnRfSW5kZXgsQXJlYSklPiUgZ3JvdXBfYnkoQXJlYSkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSAgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQphcmVhZHMNCmBgYA0KDQpgYGB7cn0NCmFyZWFkczE8LSBkYXRhICU+JSBzZWxlY3QoQWNjaWRlbnRfSW5kZXgsQXJlYSxBY2NpZGVudF9TZXZlcml0eSklPiUgZ3JvdXBfYnkoQXJlYSxBY2NpZGVudF9TZXZlcml0eSkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSAgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQphcmVhZHMxDQpgYGANCg0KDQpgYGB7cn0NCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKHNwZF9sdD1jYXNlX3doZW4oU3BlZWRfbGltaXQgJWluJSAxOjIwIH4iMC0zMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWVkX2xpbWl0ICVpbiUgMjA6MzAgfiAiMzAtNjAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVlZF9saW1pdCAlaW4lIDQwOjYwIH4iNjAtMTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlZWRfbGltaXQgPT0gNzAgfiIxMDAtMTMwIikpDQp0YWJsZShkYXRhJHNwZF9sdCkNCg0KYGBgDQpgYGB7cn0NCnNwZGx0PC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LHNwZF9sdCklPiUgZ3JvdXBfYnkoc3BkX2x0KSAlPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lICBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCnNwZGx0DQoNCmBgYA0KDQpgYGB7cn0NCnNwZGx0MTwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCxzcGRfbHQsQWNjaWRlbnRfU2V2ZXJpdHkpJT4lIGdyb3VwX2J5KHNwZF9sdCxBY2NpZGVudF9TZXZlcml0eSkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSAgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQpzcGRsdDENCg0KYGBgDQoNCg0KYGBge3J9DQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShIaXRfb2JqZWN0X29uX2NhcnJhaWdlX3dheSA9Y2FzZV93aGVuKEhpdF9PYmplY3RfaW5fQ2FycmlhZ2V3YXkgPT0gMSB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIEhpdF9PYmplY3RfaW5fQ2FycmlhZ2V3YXkgPT0gMiB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgIEhpdF9PYmplY3RfaW5fQ2FycmlhZ2V3YXkgPT0gNCB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIEhpdF9PYmplY3RfaW5fQ2FycmlhZ2V3YXkgPT0gNTo3IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0X09iamVjdF9pbl9DYXJyaWFnZXdheSA9PSA5OjEyIH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0X09iamVjdF9pbl9DYXJyaWFnZXdheSA9PSA4IH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0X09iamVjdF9pbl9DYXJyaWFnZXdheSA9PSAwIH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0X09iamVjdF9pbl9DYXJyaWFnZXdheSA9PSAyIH4gMCwpKQ0KDQp0YWJsZShkYXRhJEhpdF9vYmplY3Rfb25fY2FycmFpZ2Vfd2F5KQ0KYGBgDQoNCg0KYGBge3J9DQpvYnN0YWNsZTwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCxIaXRfb2JqZWN0X29uX2NhcnJhaWdlX3dheSklPiUgZ3JvdXBfYnkoSGl0X29iamVjdF9vbl9jYXJyYWlnZV93YXkpICU+JSBkcm9wX25hKEhpdF9vYmplY3Rfb25fY2FycmFpZ2Vfd2F5KSU+JSBzdW1tYXJpc2UodF9jb3VudCA9IG4oKSklPiUgIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0Kb2JzdGFjbGUNCg0KYGBgDQoNCmBgYHtyfQ0Kb2JzdGFjbGUxPC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LEhpdF9vYmplY3Rfb25fY2FycmFpZ2Vfd2F5LEFjY2lkZW50X1NldmVyaXR5LCklPiUgZ3JvdXBfYnkoSGl0X29iamVjdF9vbl9jYXJyYWlnZV93YXksQWNjaWRlbnRfU2V2ZXJpdHkpICU+JSBkcm9wX25hKEhpdF9vYmplY3Rfb25fY2FycmFpZ2Vfd2F5KSU+JSBzdW1tYXJpc2UodF9jb3VudCA9IG4oKSklPiUgIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0Kb2JzdGFjbGUxDQpgYGANCg0KDQpgYGB7cn0NCmRhdGE8LWRhdGElPiUNCiAgZmlsdGVyKFgxc3RfUG9pbnRfb2ZfSW1wYWN0ICVpbiUgMDo0KQ0KDQpgYGANCmBgYHtyfQ0KdGFibGUoZGF0YSRYMXN0X1BvaW50X29mX0ltcGFjdCkNCmBgYA0KDQpgYGB7cn0NCmltcGFjdDwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCxYMXN0X1BvaW50X29mX0ltcGFjdCklPiUgZ3JvdXBfYnkoWDFzdF9Qb2ludF9vZl9JbXBhY3QpICU+JSBkcm9wX25hKFgxc3RfUG9pbnRfb2ZfSW1wYWN0KSU+JSBzdW1tYXJpc2UodF9jb3VudCA9IG4oKSklPiUgIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0KaW1wYWN0DQoNCmBgYA0KDQpgYGB7cn0NCmltcGFjdDE8LSBkYXRhICU+JSBzZWxlY3QoQWNjaWRlbnRfSW5kZXgsWDFzdF9Qb2ludF9vZl9JbXBhY3QsQWNjaWRlbnRfU2V2ZXJpdHkpJT4lIGdyb3VwX2J5KFgxc3RfUG9pbnRfb2ZfSW1wYWN0LEFjY2lkZW50X1NldmVyaXR5KSAlPiUgZHJvcF9uYShYMXN0X1BvaW50X29mX0ltcGFjdCklPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lICBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCmltcGFjdDENCmBgYA0KDQoNCnBlZGVzdHJpYW4gbW92ZW1lbnQgDQpgYGB7cn0NCmRhdGEgPC0gZGF0YSAlPiUNCiAgbXV0YXRlKFBlZGVzdHJpYW5fTXZ0PWNhc2Vfd2hlbihQZWRlc3RyaWFuX01vdmVtZW50ICVpbiUgIDE6NCB+MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWRlc3RyaWFuX01vdmVtZW50ICVpbiUgIDU6OSB+MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWRlc3RyaWFuX01vdmVtZW50ID09ICAwIH4wDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQp0YWJsZShkYXRhJFBlZGVzdHJpYW5fTXZ0KQ0KYGBgDQoNCg0KYGBge3J9DQpwZWRtb3ZlPC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LFBlZGVzdHJpYW5fTXZ0KSU+JSBncm91cF9ieShQZWRlc3RyaWFuX012dCklPiUgIGRyb3BfbmEoUGVkZXN0cmlhbl9NdnQpJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSAgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQpwZWRtb3ZlDQpgYGANCg0KYGBge3J9DQoNCnBlZG1vdmUxPC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LFBlZGVzdHJpYW5fTXZ0LEFjY2lkZW50X1NldmVyaXR5KSU+JSBncm91cF9ieShQZWRlc3RyaWFuX012dCxBY2NpZGVudF9TZXZlcml0eSklPiUgIGRyb3BfbmEoUGVkZXN0cmlhbl9NdnQpJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSAgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQpwZWRtb3ZlMQ0KYGBgDQoNCkNhc3VhbHR5IHR5cGUgDQpgYGB7cn0NCg0KdGFibGUoZGF0YSRDYXN1YWx0eV9UeXBlKQ0KYGBgDQoNCg0KDQpjYXN1YWx0eSBjbGFzcyB0aGlzIHRvdyBhcmUgaW50ZXJjaGFuZ2FibGUgYW5kIGNhc2F1bHR5IHR5cGUNCmBgYHtyfQ0KY2FzdHlwPC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LENhc3VhbHR5X0NsYXNzKSU+JSBncm91cF9ieShDYXN1YWx0eV9DbGFzcyklPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lICBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCmNhc3R5cA0KYGBgDQoNCg0KYGBge3J9DQpjYXN0eXAxPC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LENhc3VhbHR5X0NsYXNzLEFjY2lkZW50X1NldmVyaXR5KSU+JSBncm91cF9ieShDYXN1YWx0eV9DbGFzcyxBY2NpZGVudF9TZXZlcml0eSklPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lICBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCmNhc3R5cDENCmBgYA0KDQoNCmJ5IHZhcmlhdGUgYW5hbHlzaXMgDQoNCg0KYGBge3J9DQoNCmhpZ2h3YXlfdXJiYW4gPC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LCBVcmJhbl9vcl9SdXJhbF9BcmVhLCBIaWdod2F5ICklPiUgZ3JvdXBfYnkoVXJiYW5fb3JfUnVyYWxfQXJlYSwgSGlnaHdheSApICU+JSBzdW1tYXJpc2UodF9jb3VudCA9IG4oKSkNCmhpZ2h3YXlfdXJiYW4NCmNoYXJ0X2hpZ2h3YXlfdXJiYW48LSBnZ3Bsb3QoZGF0YT1oaWdod2F5X3VyYmFuLCBhZXMoeD1IaWdod2F5LCB5PXRfY291bnQsIGZpbGw9VXJiYW5fb3JfUnVyYWxfQXJlYSkpK2dlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKStnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlMChyb3VuZCh0X2NvdW50LCAyKSkpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuOSkpK2xhYnMoeT0iTnVtYmVyIG9mIGFjY2lkZW50cyIsIHg9ICJSb2FkIHR5cGUiKSsgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSAiQXJlYSIsIGxhYmVscz1jKCJVcmJhbiIsICJSdXJhbCIpKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uPSJob3Jpem9udGFsIiwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID1jKCIjMDBCRkZGIiwgIiMxRTkwRkYiKSkNCg0KY2hhcnRfaGlnaHdheV91cmJhbg0KYGBgDQoNCg0KYXJlYSANCg0KYGBge3J9DQoNCmFyZWFzZXY8LSBkYXRhICU+JSBzZWxlY3QoQWNjaWRlbnRfSW5kZXgsQWNjaWRlbnRfU2V2ZXJpdHksIEFyZWEpJT4lIGdyb3VwX2J5KEFjY2lkZW50X1NldmVyaXR5LEFyZWEpICU+JSBzdW1tYXJpc2UodF9jb3VudCA9IG4oKSklPiUgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQphcmVhc2V2DQpjaGFydF9hcmVhc2V2PC0gZ2dwbG90KGRhdGE9YXJlYXNldiwgYWVzKHg9QWNjaWRlbnRfU2V2ZXJpdHksIHk9dF9jb3VudCwgZmlsbD0gQXJlYSkpK2dlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKStnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlMChyb3VuZCh0X2NvdW50LCAyKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3Q9MC45KSkrbGFicyh5PSJQZXJjZW50YWdlIiwgeD0gIkFjY2lkZW50IHNldmVyaXR5IikrIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0gIkFyZWEiLCBsYWJlbHM9YygiSGlnaGV3YXkiLCAiVXJiYW4iLCAiUnVyYWwiKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbj0iaG9yaXpvbnRhbCIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkjK3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MiIpICNzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPWMoIiMwMEJGRkYiLCAiIzFFOTBGRiIsICIjNDE2OUUxIikpDQoNCmNoYXJ0X2FyZWFzZXYNCmBgYA0KDQoNCmBgYHtyfQ0KbWFudWV2c2V2PC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LEFjY2lkZW50X1NldmVyaXR5LCBWZWhpY2xlX01hbm9ldXZyZV9jYXRlZ29yeSklPiUgZ3JvdXBfYnkoVmVoaWNsZV9NYW5vZXV2cmVfY2F0ZWdvcnksIEFjY2lkZW50X1NldmVyaXR5KSAlPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lIGRyb3BfbmEoVmVoaWNsZV9NYW5vZXV2cmVfY2F0ZWdvcnkpJT4lIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0KbWFudWV2c2V2DQoNCg0KYGBgDQoNCg0KIyMjIyMjIyMjIyMjIyBBREFTIGNsYXNzaWZpY2F0aW9uIA0KYGBge3J9DQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShhY2NpZGVudF90eXBlPWNhc2Vfd2hlbihWZWhpY2xlX01hbm9ldXZyZV9jYXRlZ29yeT09IkdvaW5nX2FoZWFkX01hbm9ldXZyZSImIFgxc3RfUG9pbnRfb2ZfSW1wYWN0PT0xICYgTnVtYmVyX29mX1ZlaGljbGVzPT0yICYgSnVuY3Rpb25fRGV0YWlsPT0wIH4gIlJlYXItZW5kIGNvbGxpc2lvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICBWZWhpY2xlX01hbm9ldXZyZV9jYXRlZ29yeT09IlR1cm5pbmdfTWFub2V1dnJlIiAmIFgxc3RfUG9pbnRfb2ZfSW1wYWN0ICVpbiUgMzo0ICYgTnVtYmVyX29mX1ZlaGljbGVzPT0yICZKdW5jdGlvbl9EZXRhaWwgJWluJSAxOjkgfiAiVHVybmluZyBjb2xsaXNpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgVmVoaWNsZV9NYW5vZXV2cmVfY2F0ZWdvcnk9PSJHb2luZ19haGVhZF9NYW5vZXV2cmUiICYgTnVtYmVyX29mX1ZlaGljbGVzPT0yICYgWDFzdF9Qb2ludF9vZl9JbXBhY3QgJWluJSAyOjMgJkp1bmN0aW9uX0RldGFpbCAlaW4lIDE6OSB+ICJFbnRlcmluZy9jcm9zc2luZyBjb2xsaXNpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgVmVoaWNsZV9NYW5vZXV2cmVfY2F0ZWdvcnk9PSJMYW5lX2NoYW5nZV9NYW5vZXV2cmUiICYgSGl0X29iamVjdF9vbl9jYXJyYWlnZV93YXk9PTEgfiAiQ29sbGlzaW9uIHdpdGggc3RhdGlvbmFyeSB0cmFmZmljIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIFZlaGljbGVfTWFub2V1dnJlX2NhdGVnb3J5PT0iTGFuZV9jaGFuZ2VfTWFub2V1dnJlIiYgWDFzdF9Qb2ludF9vZl9JbXBhY3QgJWluJSAzOjQgfiJjb2xsaXNpb24gd2l0aCBsb25naXR1bmFsIHRyYWZmaWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgUGVkZXN0cmlhbl9NdnQgPT0xICYgQ2FzdWFsdHlfQ2xhc3M9PTMgfiAiQWNjaWRlbnQgd2l0aCBwZWRlc3RyaWFuIGNyb3NzaW5nIHRoZSByb2FkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIEhpdF9vYmplY3Rfb25fY2FycmFpZ2Vfd2F5PT0xICYgWDFzdF9Qb2ludF9vZl9JbXBhY3QgPT0xIH4iQWNjaWRlbnQgd2l0aCBvdGhlciBvYnNjdGFjbGVzIG9uIHRoZSBjYXJyaWFnZXdheSINCiAgICAgICAgICAgICAgICAgICAgICAgICkpDQpgYGANCg0KYGBge3J9DQp0YWJsZShkYXRhJGFjY2lkZW50X3R5cGUpDQoNCmBgYA0KDQpgYGB7cn0NCmFjY3R5cGU8LSBkYXRhICU+JSBzZWxlY3QoQWNjaWRlbnRfSW5kZXgsYWNjaWRlbnRfdHlwZSAgKSU+JSBncm91cF9ieShhY2NpZGVudF90eXBlKSAlPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lZHJvcF9uYShhY2NpZGVudF90eXBlKSU+JSBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCmFjY3R5cGUNCmNoYXJ0X2FjY3R5cGU8LSBnZ3Bsb3QoZGF0YT1hY2N0eXBlLCBhZXMoeD1hY2NpZGVudF90eXBlICwgeT10X2NvdW50LCBmaWxsPSBhY2NpZGVudF90eXBlICkpK2dlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKStnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlMChyb3VuZCh0X2NvdW50LCAyKSwgIiUiKSkscG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC45KSwgdmp1c3Q9LTAuMjUpDQpjaGFydF9hY2N0eXBlDQpgYGANCg0KYGBge3J9DQphY2N0eXBlYXJlYTwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCxBcmVhLGFjY2lkZW50X3R5cGUpJT4lIGdyb3VwX2J5KGFjY2lkZW50X3R5cGUsQXJlYSkgJT4lIGRyb3BfbmEoYWNjaWRlbnRfdHlwZSkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCmFjY3R5cGVhcmVhDQpjaGFydF9hY2N0eXBlYXJlYTwtIGdncGxvdChkYXRhPWFjY3R5cGVhcmVhLCBhZXMoeD1hY2NpZGVudF90eXBlLCB5PXRfY291bnQsIGZpbGw9IEFyZWEgKSkrZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpK2dlb21fdGV4dChhZXMobGFiZWw9cGFzdGUwKHJvdW5kKHRfY291bnQsIDIpLCAiJSIpKSxwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0wLjkpKStsYWJzKHk9IlBlcmNlbnQgJSIsIHg9ICJBY2NpZGVudCBUeXBlIikrIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0gIkFyZWEiLCBsYWJlbHM9YygiSGlnaHdheSIsICJVcmJhbiIsICJSdXJhbCIpKQ0KDQpjaGFydF9hY2N0eXBlYXJlYQ0KYGBgDQpgYGB7cn0NCmFjY3R5cHNwZWVkPC0gZGF0YSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LHNwZF9sdCxhY2NpZGVudF90eXBlKSU+JSBncm91cF9ieShhY2NpZGVudF90eXBlLHNwZF9sdCkgJT4lIGRyb3BfbmEoYWNjaWRlbnRfdHlwZSkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCmFjY3R5cHNwZWVkDQpjaGFydF9hY2N0eXBzcGVlZDwtIGdncGxvdChkYXRhPWFjY3R5cHNwZWVkLCBhZXMoeD1hY2NpZGVudF90eXBlLCB5PXRfY291bnQsIGZpbGw9IHNwZF9sdCApKStnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZTAocm91bmQodF9jb3VudCwgMiksICIlIikpLHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuOSkpK2xhYnMoeT0iUGVyY2VudCAlIiwgeD0gIkFjY2lkZW50IFR5cGUiKSAjc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSAiQXJlYSIsIGxhYmVscz1jKCJIaWdod2F5IiwgIlVyYmFuIiwgIlJ1cmFsIikpDQoNCmNoYXJ0X2FjY3R5cHNwZWVkDQpgYGANCnNldmVyaXR5LCBqdXN0IHNsaWdodCBhbmQgZmF0YWwgYXMgQURBUyBjYW4gbm90IGRvIG11Y2ggYWJvdXQgc2xpZ2h0DQpgYGB7cn0NCmFjY3R5cHNldjwtIGRhdGEgJT4lIHNlbGVjdChBY2NpZGVudF9JbmRleCxBY2NpZGVudF9TZXZlcml0eSxhY2NpZGVudF90eXBlKSU+JSBncm91cF9ieShhY2NpZGVudF90eXBlLEFjY2lkZW50X1NldmVyaXR5KSAlPiUgZHJvcF9uYShhY2NpZGVudF90eXBlKSAlPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0KYWNjdHlwc2V2DQpjaGFydF9hY2N0eXBzZXY8LSBnZ3Bsb3QoZGF0YT1hY2N0eXBzZXYsIGFlcyh4PWFjY2lkZW50X3R5cGUsIHk9dF9jb3VudCwgZmlsbD1BY2NpZGVudF9TZXZlcml0eSApKStnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZTAocm91bmQodF9jb3VudCwgMiksICIlIikpLHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuOSkpK2xhYnMoeT0iUGVyY2VudCAlIiwgeD0gIkFjY2lkZW50IFR5cGUiKSAjc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSAiQXJlYSIsIGxhYmVscz1jKCJIaWdod2F5IiwgIlVyYmFuIiwgIlJ1cmFsIikpDQoNCmNoYXJ0X2FjY3R5cHNldg0KDQpgYGANCg0KYGBge3J9DQphY2N0eXBhbGw8LSBkYXRhICU+JSBzZWxlY3QoQWNjaWRlbnRfSW5kZXgsQWNjaWRlbnRfU2V2ZXJpdHksYWNjaWRlbnRfdHlwZSwgQXJlYSwgc3BkX2x0KSU+JSBncm91cF9ieShhY2NpZGVudF90eXBlLEFyZWEsIHNwZF9sdCxBY2NpZGVudF9TZXZlcml0eSkgJT4lIGRyb3BfbmEoYWNjaWRlbnRfdHlwZSkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCmFjY3R5cGFsbA0KDQpgYGANCg0KYGBge3J9DQpkYXRhYTEgPC0gZGF0YQ0KDQpkYXRhYTFmaWx0ZXIoZGF0YWExLCBBZ2Vfb2ZfVmVoaWNsZSA8IDUgJiBBY2NpZGVudF9TZXZlcml0eSAhPTMpIA0KICANCmBgYA0KDQpgYGB7cn0NCmRhdGFhMTwtZGF0YWExICU+JQ0KICBmaWx0ZXIoQWdlX29mX1ZlaGljbGUgJWluJSAxOjYgJiBBY2NpZGVudF9TZXZlcml0eSAlaW4lIDE6MikNCmBgYA0KDQoNCmBgYHtyfQ0KYWNjdHlwYWxsMjwtIGRhdGFhMSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LEFjY2lkZW50X1NldmVyaXR5LGFjY2lkZW50X3R5cGUsIEFyZWEsIHNwZF9sdCklPiUgZ3JvdXBfYnkoYWNjaWRlbnRfdHlwZSxBcmVhLCBzcGRfbHQsQWNjaWRlbnRfU2V2ZXJpdHkpICU+JSBkcm9wX25hKGFjY2lkZW50X3R5cGUpICU+JSBzdW1tYXJpc2UodF9jb3VudCA9IG4oKSklPiUgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQphY2N0eXBhbGwyDQpgYGANCg0KYGBge3J9DQphY2N0eXBlMTwtIGRhdGFhMSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LGFjY2lkZW50X3R5cGUgICklPiUgZ3JvdXBfYnkoYWNjaWRlbnRfdHlwZSkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JWRyb3BfbmEoYWNjaWRlbnRfdHlwZSklPiUgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQphY2N0eXBlDQpjaGFydF9hY2N0eXBlMTwtIGdncGxvdChkYXRhPWFjY3R5cGUxLCBhZXMoeD1hY2NpZGVudF90eXBlICwgeT10X2NvdW50LCBmaWxsPSBhY2NpZGVudF90eXBlICkpK2dlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKStnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlMChyb3VuZCh0X2NvdW50LCAyKSwgIiUiKSkscG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC45KSwgdmp1c3Q9LTAuMjUpDQpjaGFydF9hY2N0eXBlMQ0KYGBgDQpgYGB7cn0NCmFjY3R5cHNwZWVkMTwtIGRhdGFhMSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LHNwZF9sdCxhY2NpZGVudF90eXBlKSU+JSBncm91cF9ieShhY2NpZGVudF90eXBlLHNwZF9sdCkgJT4lIGRyb3BfbmEoYWNjaWRlbnRfdHlwZSkgJT4lIHN1bW1hcmlzZSh0X2NvdW50ID0gbigpKSU+JSBtdXRhdGUodF9jb3VudCA9IHRfY291bnQvc3VtKHRfY291bnQpKjEwMCkNCmFjY3R5cHNwZWVkMQ0KY2hhcnRfYWNjdHlwc3BlZWQxPC0gZ2dwbG90KGRhdGE9YWNjdHlwc3BlZWQxLCBhZXMoeD1hY2NpZGVudF90eXBlLCB5PXRfY291bnQsIGZpbGw9IHNwZF9sdCApKStnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZTAocm91bmQodF9jb3VudCwgMiksICIlIikpLHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuOSkpK2xhYnMoeT0iUGVyY2VudCAlIiwgeD0gIkFjY2lkZW50IFR5cGUiKSAjc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSAiQXJlYSIsIGxhYmVscz1jKCJIaWdod2F5IiwgIlVyYmFuIiwgIlJ1cmFsIikpDQoNCmNoYXJ0X2FjY3R5cHNwZWVkMQ0KDQpgYGANCmBgYHtyfQ0KYWNjdHlwc2V2MTwtIGRhdGFhMSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LEFjY2lkZW50X1NldmVyaXR5LGFjY2lkZW50X3R5cGUpJT4lIGdyb3VwX2J5KGFjY2lkZW50X3R5cGUsQWNjaWRlbnRfU2V2ZXJpdHkpICU+JSBkcm9wX25hKGFjY2lkZW50X3R5cGUpICU+JSBzdW1tYXJpc2UodF9jb3VudCA9IG4oKSklPiUgbXV0YXRlKHRfY291bnQgPSB0X2NvdW50L3N1bSh0X2NvdW50KSoxMDApDQphY2N0eXBzZXYNCmNoYXJ0X2FjY3R5cHNldjE8LSBnZ3Bsb3QoZGF0YT1hY2N0eXBzZXYxLCBhZXMoeD1hY2NpZGVudF90eXBlLCB5PXRfY291bnQsIGZpbGw9QWNjaWRlbnRfU2V2ZXJpdHkgKSkrZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpK2dlb21fdGV4dChhZXMobGFiZWw9cGFzdGUwKHJvdW5kKHRfY291bnQsIDIpLCAiJSIpKSxwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0wLjkpKStsYWJzKHk9IlBlcmNlbnQgJSIsIHg9ICJBY2NpZGVudCBUeXBlIikgI3NjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0gIkFyZWEiLCBsYWJlbHM9YygiSGlnaHdheSIsICJVcmJhbiIsICJSdXJhbCIpKQ0KDQpjaGFydF9hY2N0eXBzZXYxDQpgYGANCg0KDQpgYGB7cn0NCmFjY3R5cGVhcmVhMTwtIGRhdGFhMSAlPiUgc2VsZWN0KEFjY2lkZW50X0luZGV4LEFyZWEsYWNjaWRlbnRfdHlwZSklPiUgZ3JvdXBfYnkoYWNjaWRlbnRfdHlwZSxBcmVhKSAlPiUgZHJvcF9uYShhY2NpZGVudF90eXBlKSAlPiUgc3VtbWFyaXNlKHRfY291bnQgPSBuKCkpJT4lIG11dGF0ZSh0X2NvdW50ID0gdF9jb3VudC9zdW0odF9jb3VudCkqMTAwKQ0KYWNjdHlwZWFyZWExDQpjaGFydF9hY2N0eXBlYXJlYTE8LSBnZ3Bsb3QoZGF0YT1hY2N0eXBlYXJlYTEsIGFlcyh4PWFjY2lkZW50X3R5cGUsIHk9dF9jb3VudCwgZmlsbD0gQXJlYSApKStnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZTAocm91bmQodF9jb3VudCwgMiksICIlIikpLHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuOSkpK2xhYnMoeT0iUGVyY2VudCAlIiwgeD0gIkFjY2lkZW50IFR5cGUiKSsgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSAiQXJlYSIsIGxhYmVscz1jKCJIaWdod2F5IiwgIlVyYmFuIiwgIlJ1cmFsIikpDQoNCmNoYXJ0X2FjY3R5cGVhcmVhMQ0KYGBgDQoNCg==